Drupal 10 模块开发

作者: 游鱼思


开发环境准备

官方推荐使用DDEV,基于Docker

Symfony

是 Drupal 的底层框架。

Service

Hook

在 .module 文件里调用Hook

调用格式:自定义模块名_hook方法名

路由系统

在 Drupal 中,路由是一个系统,它负责处理和响应 HTTP 请求。路由系统将 URL 路径映射到特定的控制器方法(也称为回调函数),这个方法负责生成请求的响应。

每个路由都有一个唯一的路由名称,以及与之关联的路径(URL)、控制器类和方法、访问权限等信息。这些信息通常在模块的 *.routing.yml 文件中定义。

例如,你可能有一个路由,它的路径是 /my-module/my-page,当用户访问这个 URL 时,Drupal 的路由系统会找到与这个路径关联的控制器方法,并执行它来生成页面的内容。

路由系统是 Drupal 的核心组件,它使得模块可以定义自己的页面、表单、API 端点等,而无需关心底层的 HTTP 机制。

Controller组件

在 Drupal 中,Controller 是处理 HTTP 请求并返回一个响应的组件。每个 Controller 类通常包含一个或多个方法,这些方法被称为 "controller methods" 或 "action methods"。每个方法对应一个特定的路由(URL),当该路由被请求时,对应的方法就会被执行。

Controller 的主要职责是:

接收请求:Controller 从请求对象中获取输入和参数。

处理请求:Controller 使用获取的输入和参数执行必要的业务逻辑。

返回响应:Controller 生成并返回一个响应对象。这个响应可以是一个 HTML 页面,也可以是 JSON 数据,或者其他任何格式的内容。

在 Drupal 中,Controller 类通常放在模块的 src/Controller 目录下,并且需要继承 Drupal\Core\Controller\ControllerBase 类。ControllerBase 类提供了一些常用的便利方法,例如访问数据库、翻译系统、当前用户等。

表单

在 Drupal 中,创建自定义表单需要创建一个新的类,该类继承自 Drupal\Core\Form\FormBase 或 Drupal\Core\Form\ConfigFormBase,并实现 FormInterface 接口。这个类需要定义一些特定的方法,包括 getFormId(), buildForm(), validateForm(), 和 submitForm()。

ContainerInterface 是 Symfony 组件的一部分,Symfony 是 Drupal 的底层框架。ContainerInterface 是服务容器的接口,服务容器是用于管理服务(如数据库连接、配置系统等)的对象。

create() 方法是一个特殊的方法,它允许 Drupal 的依赖注入容器自动为你的表单类提供服务。这个方法接收一个 ContainerInterface 参数,你可以从这个容器中获取你需要的服务。

以下是一个创建自定义表单的基本示例:

'''php

namespace Drupal\momo_papers\Form;

use Drupal\Core\Form\FormBase;

use Drupal\Core\Form\FormStateInterface;

use Symfony\Component\DependencyInjection\ContainerInterface;

class MomoPapers extends FormBase {

public static function create(ContainerInterface $container) {

// 在这里,你可以从 $container 中获取你需要的服务,并将它们作为你的类的构造函数的参数。

// 例如,如果你需要数据库连接,你可以这样做:

// $database = $container->get('database');

// return new static($database);

}

public function getFormId() {

// 返回一个唯一的字符串,用于标识你的表单。

return 'momo_papers';

}

public function buildForm(array $form, FormStateInterface $form_state) {

// 在这里,你可以构建你的表单数组。

// 例如,你可以添加一个文本字段:

// $form['example'] = [

// '#type' => 'textfield',

// '#title' => $this->t('Example'),

// ];

// return $form;

}

public function validateForm(array &$form, FormStateInterface $form_state) {

// 在这里,你可以添加你的表单验证逻辑。

}

public function submitForm(array &$form, FormStateInterface $form_state) {

// 在这里,你可以处理表单提交的数据。

}

}

'''

需要在你的模块的 *.routing.yml 文件中定义一个路由,以便用户可以访问你的表单。

注释

采用 PHPDoc 来注释标签。

{@inheritdoc} 是一个特殊的注释标签,通常用在 DocBlocks(PHPDoc 注释)中。它的主要作用是表示当前方法的注释应该从父类或接口继承。当你在子类的方法上使用 {@inheritdoc} 注释时,这意味着你想要使用父类或实现的接口上相同方法的注释。这在你覆盖或实现父类或接口的方法时非常有用,因为你可以避免重复编写相同的注释。

@return array:这个标签表示该方法将返回一个数组。这对于理解方法的预期输出和编写调用代码非常有用。

@ingroup :这个标签将当前元素(通常是一个类、方法或函数)分配到一个特定的“组”或“模块”。这在生成文档时非常有用,因为它允许你根据组来组织和分类文档。